#include"Reactor.hpp"
#include"sock.hpp"
#include"Accepter.hpp"
#include"Util.hpp"
void Usage(string proc)
{
  cout<<"Usage: "<<proc<<" port"<<endl;
}

int main(int argc,char *argv[])
{
  if(argc!=2)
  {
    Usage(argv[0]);
    exit(1);
  }
  //1.创建socket，监听
  int listen_sock = Sock::Socket();
  uint16_t port = (uint16_t)atoi(argv[1]);
  SetNonBlock(listen_sock);//将套接字设置成非阻塞
  Sock::Bind(listen_sock,port);
  Sock::Listen(listen_sock);

  //2.创建Reactor对象
  //Reactor 反应堆模式：通过多路转接方案，被动的采用事件派发的方式，去调对应的回调函数： 
  Reactor *R = new Reactor();
  R->InitReactor();

  //3.
  Event *evp = new Event();
  evp->sock=listen_sock;
  evp->R = R;//
  //Accepter 链接管理器
  evp->RegisterCallback(Accepter,nullptr,nullptr);
  R->InsertEvent(evp,EPOLLIN|EPOLLET);//ET 

 //4.开始进行事件派发
 int timeout =1000;
 for(;;)
 {
   R->Dispatcher(timeout);
   
 }



  return 0;
}
